package nl.ipo.cds.etl.postvalidation;
import geodb.GeoDB;
import org.apache.commons.dbcp.BasicDataSource;
import org.deegree.geometry.Geometry;
import org.deegree.geometry.io.WKTReader;
import org.deegree.geometry.primitive.Polygon;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Paths;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class H2GeometryStoreTest {
private H2GeometryStore h2GeometryStore;
private BasicDataSource dataSource;
private final static String DB_NAME = "test-db-1337";
@Rule
public final TemporaryFolder testFolder = new TemporaryFolder();
@Before
public void setUp() throws Exception {
h2GeometryStore = new H2GeometryStore();
Field field = H2GeometryStore.class.getDeclaredField("JDBC_URL_FORMAT");
field.setAccessible(true);
field.set(h2GeometryStore, String.format("jdbc:h2:%s/", testFolder.getRoot()) + "%s");
dataSource = (BasicDataSource)h2GeometryStore.createStore(DB_NAME);
}
@After
public void tearDown() throws Exception {
h2GeometryStore.destroyStore(dataSource);
}
@Test
public void testCreateStore() throws Exception {
String dbName = "test";
DataSource d = h2GeometryStore.createStore(dbName);
assertTrue(Files.exists(Paths.get(testFolder.getRoot().getPath(), dbName + ".data.db")));
assertTrue(Files.exists(Paths.get(testFolder.getRoot().getPath(), dbName + ".index.db")));
h2GeometryStore.destroyStore(d);
}
@Test
public void testAddToStore() throws Exception {
WKTReader reader = new WKTReader(null);
Geometry g = reader.read("SRID=28992;POLYGON((111446.5 566602,112035.5 566602,112035.5 566886,111446.5 566886,111446.5 566602))");
TestPersistableFeature tpf = new TestPersistableFeature();
tpf.setGeometry(g);
tpf.setId("test-feature");
h2GeometryStore.addToStore(dataSource, g, tpf.getId(), tpf.getId() );
JdbcTemplate t = new JdbcTemplate(dataSource);
// Test if the Geometry can properly get stored/retrieved.
Geometry g2 = (Polygon) reader.read(GeoDB.ST_AsText(t.queryForObject("SELECT geometry FROM geometries LIMIT 1", byte[].class)));
assertEquals(g.toString(), g2.toString());
}
@Test
public void testDestroyStore() throws Exception {
h2GeometryStore.destroyStore(dataSource);
// TODO: Add proper checking. Problem is that the H2 database files are only removed after the last connection closes.
// This cleanup apparently occurs after this test code is run.
//assertFalse(Files.exists(Paths.get(testFolder.getRoot().getPath(), DB_NAME + ".data.db")));
//assertFalse(Files.exists(Paths.get(testFolder.getRoot().getPath(), DB_NAME + ".index.db")));
}
}